package springmvc.high.config;

import springmvc.high.interceptor.MyInterceptor;
import springmvc.high.interceptor.MyInterceptor1;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

/**
 * description: springmvc组件的配置类
 * TODO： 拦截器注册
 *
 * 1. 默认拦截所有请求
 * 2. 指定拦截的路径，通过方法 .addPathPatterns("") 实现
 * 3. 在指定拦截路径中，排除特定路径，通过方法 .addPathPatterns("").excludePathPatterns("") 实现
 * 4. 拦截器执行顺序：先调用的优先级高，包住后调用的
 * 5. 拦截器的执行流程在 DispatcherServlet 源码中
 */

@Configuration
@ComponentScan({"springmvc.high.controller", "springmvc.high.error"})
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //配置方案1： 拦截全部请求
        //registry.addInterceptor(new MyInterceptor());

        //配置方案2： 指定地址拦截 .addPathPatterns("/user/data");
        //   *  任意一层字符串   ** 任意多层字符串
//        registry.addInterceptor(new MyInterceptor())
//                .addPathPatterns("/user/**");

        //配置方案3：排除拦截 排除的地址应该在拦截地址内部！
//        registry.addInterceptor(new MyInterceptor())
//                .addPathPatterns("/user/**").excludePathPatterns("/user/data1");

        // 多个拦截器的执行顺序
        registry.addInterceptor(new MyInterceptor());
        registry.addInterceptor(new MyInterceptor1());
        /**执行结果：
         * MyInterceptor.preHandle
         * MyInterceptor1.preHandle
         * UserController.data1
         * message = / by zero
         * MyInterceptor1.afterCompletion
         * MyInterceptor.afterCompletion
         */
    }
}
